package com.biz.primus.ms.payment.channel.allinpay.req;

import com.biz.primus.common.utils.JsonUtils;
import com.biz.primus.model.payment.enums.PaymentTradeType;
import com.biz.primus.ms.payment.channel.allinpay.res.AllInPayPayRespVo;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.client.RestTemplate;

import javax.validation.constraints.NotNull;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.UUID;

/**
 * AllInPayPaymentReqVo
 *
 * @author JKLiues
 * @date 2017年11月10日
 */
@Getter
@Setter
@Slf4j
public class AllInPayUnifiedOrder extends AllInPayRequestBase {
    private static final long serialVersionUID = 5660313854790204308L;
    //        private static final String API_URL = "https://vsp.allinpay.com/apiweb/unitorder/pay";
    private static final String API_URL = "http://113.108.182.3:10080/apiweb/unitorder/pay";
    /**
     * 商户号	平台分配的商户号
     */
    private String cusid;
    /**
     * 应用ID	平台分配的APPID
     */
    private String appid;
    /**
     * 版本号	接口版本号
     */
    private Long version = 1L;
    /**
     * 交易订单号
     */
    private String reqsn;

    /**
     * 交易金额（分）
     */
    @NotNull
    private Integer trxamt;

    /**
     * 交易方式
     */
    @NotNull
    private PaymentTradeType paytype;

    /**
     * 订单标题
     */
    private String body;

    /**
     * 备注
     */
    private String remark;

    /**
     * 订单过期时间默认15 单位分钟
     */
    private Integer validtime;

    /**
     * JS支付时使用
     * 微信支付-用户的微信openid
     * 支付宝支付-用户user_id
     */
    private String acct;

    /**
     * 接收微信支付异步通知回调地址，通知url必须为直接可访问的url，不能携带参数。
     */
    private String notify_url;

    /**
     * no_credit--指定不能使用信用卡支付
     * 暂时只对微信支付有效,仅支持no_credit
     */
    private String limit_pay;
    /**
     * 随机字符串
     */
    private String randomstr = UUID.randomUUID().toString();


    /**
     * 支付授权码	如微信,支付宝,银联的付款二维码
     */
    private String authcode;

    public AllInPayPayRespVo execute(String sign) {
        RestTemplate restTemplate = getRestTemplate();
        TreeMap<String, Object> params = new TreeMap<>();
        params.put("cusid", this.cusid);
        params.put("appid", this.appid);
        params.put("version", 1L);
        params.put("trxamt", this.trxamt);
        params.put("reqsn", this.reqsn);
        params.put("paytype", this.paytype);
        params.put("randomstr", this.randomstr);
        params.put("body", this.body);
        params.put("remark", this.remark);
        params.put("validtime", this.validtime);
        params.put("acct", this.acct);
        params.put("notify_url", this.notify_url);
        params.put("limit_pay", this.limit_pay);
        params.put("authcode", this.authcode);
        params.put("sign", sign);
        log.info("all in pay request  {}", params);
        String s = restTemplate.postForObject(getApiUrl(), params, String.class);
        log.info("all in pay request result {}", s);
        return JsonUtils.json2Obj(s, AllInPayPayRespVo.class);

    }

    @Override
    protected String getApiUrl() {
        return API_URL;
    }

    @Override
    public TreeSet<String> getSignParams() {
        return Sets.newTreeSet(Lists.newArrayList(
                "cusid",
                "appid",
                "version",
                "trxamt",
                "reqsn",
                "paytype",
                "randomstr",
                "body",
                "remark",
                "validtime",
                "acct",
                "notify_url",
                "limit_pay",
                "authcode"));
    }
}